home *** CD-ROM | disk | FTP | other *** search
- library BERT;
- {.$DEFINE DEBUG}
- uses
- Windows, SysUtils, ISAPI, IniFiles, DB, DBTables;
-
- function GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL; stdcall;
- begin
- Ver.dwExtensionVersion := $00010000; // 1.0 support
- Ver.lpszExtensionDesc := 'Delphi 3.0 ISAPI DLL'; // Description
- Result := True;
- end {GetExtensionVersion};
-
- function HttpExtensionProc(var ECB: TEXTENSION_CONTROL_BLOCK): DWORD; stdcall;
- var
- Data: AnsiString;
-
- function Value(const Field: ShortString): ShortString;
- var
- i: Integer;
- len: Byte absolute Result;
- begin
- Len := 0;
- i := Pos('&'+Field+'=',Data);
- if i = 0 then
- begin
- i := Pos(Field+'=',Data);
- if i > 1 then i := 0
- end
- else Inc(i); { skip '&' }
- if i > 0 then
- begin
- Inc(i,Length(Field)+1);
- while Data[i] <> '&' do
- begin
- if not (Data[i] in [#10,#13]) then { ignore CR/LF }
- begin
- Inc(Len);
- Result[Len] := Data[i]
- end
- else { CR/LF -> #32 }
- begin
- if (Len = 0) or (Result[Len] <> #32) then
- begin
- Inc(Len);
- Result[Len] := #32
- end
- end;
- Inc(i)
- end
- end;
- while (Len > 0) and (Result[len] = #32) do Dec(len)
- end {Value};
-
- function ValueAsInteger(const Field: ShortString): Integer;
- begin
- try
- Result := StrToInt(Value(Field))
- except
- Result := 0
- end
- end {ValueAsInteger};
-
- {$I BERT.INC}
-
- var
- i: Integer;
- Str: AnsiString;
- begin
- Str := 'Hello, world!';
- try
- try
- // parse ECB input data
- if StrPas(ECB.lpszMethod) = 'POST' then
- Data := StrPas(ECB.lpbData)
- else Data := ECB.lpszQueryString;
- if (Length(Data) > 1) and
- (Data[Length(Data)] = #0) then Delete(Data,Length(Data),1);
- i := 0;
- while i < Length(Data) do
- begin
- Inc(i);
- if Data[i] = '+' then Data[i] := ' ';
- if Data[i] = '%' then { special code }
- begin
- Str := '$00';
- Str[2] := Data[i+1];
- Str[3] := Data[i+2];
- Delete(Data,i+1,2);
- Data[i] := Chr(StrToInt(Str))
- end
- end;
- if i > 0 then Data[i+1] := '&'
- else Data := '&';
- // initialize ECB output data
- ECB.lpszLogData := 'BERT - Bolesian Error Report Tool';
- ECB.dwHTTPStatusCode := 200;
-
- // create the dynamic HTML webpage here inside STR...
- try
- GenerateContents(Str);
- Str := '[' + Data + ']<P>' + Str
- except
- on E: Exception do
- Str := Str + '<P>IN<P><HR><P>' + E.ClassName + ' ' + E.Message
- end;
- except
- on E: Exception do
- Str := Str + '<P>OUT<P><HR><P>' + E.ClassName + ' ' + E.Message
- end;
- finally
- // finalize ECB output data
- Str := Format(
- 'HTTP/1.0 200 OK'#13#10+
- 'Content-Type: text/html'#13#10+
- 'Content-Length: %d'#13#10+
- 'Content:'#13#10#13#10'%s', [Length(Str), Str]);
- i := Length(Str);
- ECB.WriteClient(ECB.ConnID, Pointer(Str), i, 0)
- end;
- Result := HSE_STATUS_SUCCESS
- end {HttpExtensionProc};
-
- exports
- GetExtensionVersion,
- HttpExtensionProc;
-
- begin
- IsMultiThread := True;
- ChDir('D:');
- ChDir('cgi_bin');
- if IOResult <> 0 then { skip }
- end.
-